<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>中心状态管理</title>
</head>

<body>
    <div id="app">
        <h2>
            实现一个中心状态管理模式，所有的数据由一个全局中心的Vue实例管理，各种组件的数据、状态和方法由Vue中心持有后，
            以引用的方式下放到其他的组件之中，还可以实现父子、兄弟、先后代组件之间的通信
            这种范式易于实现，在管理中等级别的Web应用时非常有效
        </h2>
        <div>
            <son-comp></son-comp>
            <button @click="addCount">Add Count!</button>
        </div>
    </div>
    <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
    <script>
        // 声明一个状态管理中心，实际开发中不一定只有一个中心，可以有多个中心
        // 例如userStore、sellerStore等等
        const stateManager = new Vue({
            data: {
                count: 0
            },
            methods: {
                addCount() {
                    this.count++;
                }
            }
        });

        // 父组件
        new Vue({
            el: "#app",
            methods: {
                addCount: stateManager.addCount // 用代理的方式拿到addCount方法
            },
            // 子组件
            components: {
                'son-comp': {
                    template: `
                    <div>
                        <h3>这里是子组件，持有数据 {{count}}</h3>
                        <grandson-comp></grandson-comp>
                    </div>
                    `,
                    data() {
                        return stateManager.$data  // 这里的数据使用的是中心管理的数据，记得要传引用
                    },
                    // 孙组件
                    components: {
                        'grandson-comp': {
                            name: "grandson-comp",
                            functional: true,
                            render(h, ctx) {// 这里的数据使用的是中心管理的数据
                                return h('h4', '这里是孙组件，持有数据 ' + stateManager.count);
                            },
                        }
                    }
                },
            }
        });

    </script>
</body>

</html>